﻿/**
* @author Roger Wu
*/
(function($) {
    $.fn.jDrag = function(options) {
        if (typeof options == 'string') {
            if (options == 'destroy')
                return this.each(function() {
                    $(this).unbind('mousedown', $.rwdrag.start);
                    $.data(this, 'pp-rwdrag', null);
                });
        }
        return this.each(function() {

            var el = $(this);
            $.data($.rwdrag, 'pp-rwdrag', {
                options: $.extend({
                    el: el,
                    obj: el
                }, options)
            });
            if (options.event)
                $.rwdrag.start(options.event);
            else {
                var select = options.selector;
                $(select, obj).bind('mousedown', $.rwdrag.start);
            }
        });
    };
    $.rwdrag = {
        start: function(e) {
            var data = $.data(this, 'pp-rwdrag');
            var el = data.options.el[0];
            $.data(el, 'pp-rwdrag', {
                options: data.options
            });
            if (!$.rwdrag.current) {
                $.rwdrag.current = {
                    el: el,
                    oleft: parseInt(el.style.left) || 0,
                    otop: parseInt(el.style.top) || 0,
                    ox: e.pageX || e.screenX,
                    oy: e.pageY || e.screenY
                };
                $(document).bind("mouseup", $.rwdrag.stop);
                $(document).bind("mousemove", $.rwdrag.drag);
            }
        },
        drag: function(e) {
            if (!e) var e = window.event;
            var current = $.rwdrag.current;
            var data = $.data(current.el, 'pp-rwdrag');
            var left = (current.oleft + (e.pageX || e.clientX) - current.ox);
            var top = (current.otop + (e.pageY || e.clientY) - current.oy);
            if (top < 1) top = 0;
            if (data.options.move == 'horizontal') {
                if ((data.options.minW && left >= $(data.options.obj).cssv("left") + data.options.minW) && (data.options.maxW && left <= $(data.options.obj).cssv("left") + data.options.maxW))
                    current.el.style.left = left + 'px';
                else if (data.options.scop) {
                    if (data.options.relObj) {
                        if ((left - parseInt(data.options.relObj.style.left)) > data.options.cellMinW) {
                            current.el.style.left = left + 'px';
                        }
                    } else
                        current.el.style.left = left + 'px';
                }
            } else if (data.options.move == 'vertical') {
                current.el.style.top = top + 'px';
            } else {
                var selector = data.options.selector ? $(data.options.selector, data.options.obj) : $(data.options.obj);
                var selectorPos = selector.offset();
                if (left >= -selector.outerWidth() * 2 / 3
                 && top >= 0 
                 && (left + selector.outerWidth() / 3 < $(window).width()) 
                 && (top + selector.outerHeight() < $(window).height())) {
                    current.el.style.left = left + 'px';
                    current.el.style.top = top + 'px';
                }
            }

            if (data.options.drag) {
                data.options.drag.apply(current.el, [current.el]);
            }

            return $.rwdrag.preventEvent(e);
        },
        stop: function(e) {
            var current = $.rwdrag.current;
            var data = $.data(current.el, 'pp-rwdrag');
            $(document).unbind('mousemove', $.rwdrag.drag);
            $(document).unbind('mouseup', $.rwdrag.stop);
            if (data.options.stop) {
                data.options.stop.apply(current.el, [current.el]);
            }
            $.rwdrag.current = null;
            return $.rwdrag.preventEvent(e);
        },
        preventEvent: function(e) {
            if (e.stopPropagation) e.stopPropagation();
            if (e.preventDefault) e.preventDefault();
            return false;
        }
    };
})(jQuery);
